package cn.tedu.oop2;
/**本类用作测试抽象的入门案例*/
public class AbstractDemo {
    public static void main(String[] args) {
        /**4.抽象对象不可以实例化！！！--创建对象*/
        //测试抽象父类是否可以创建对象/实例化
//        Animal a=new Animal();
        //6.创建多态对象进行测试
        Animal a=new Pig();//父类引用指向子类对象
        a.eat();//调用父类自己的功能，子类没重写/实例
        a.fly();//调用父类的声明，子类实现的方法体
        a.fly2();//调用父类的声明，子类实现的方法体
    }
}
//1.创建父类
/**2.被abstract修饰的类是抽象类
 * 如果一个类中包含了抽象方法，那么这个类必须被声明成一个抽象类*/
//4.2添加了抽象方法以后，本来要用abstract修饰，变成抽象类
abstract class Animal{
    //3.创建普通方法
    public void eat(){
        System.out.println("吃啥都行");
    }
    public void play(){
        System.out.println("玩啥都行");
    }
    //4.1创建抽象方法
    /**1.被abstract修饰的方法是抽象方法，抽象方法没有方法体*/
    public abstract void fly();
    public abstract void fly2();

}
//2.创建子类
/**3.当一个子类继承了抽象父类以后，有两种结局方案
 * 方案一：变成抽象子类，“躺平，我也不实现，继续抽象”
 * 方案二：变成普通子类，“”父债子偿，子类需要实现抽象父类中所有的抽象方法*/
//abstract class Pig extends Animal{//方案一

//}
class Pig extends Animal{
    @Override//实现
    public void fly() {//方案二
        System.out.println("我爸的债终于还清了，我家的猪终于飞起来啦");
    }

    @Override
    public void fly2() {
        System.out.println("抽象父类中的所有抽象方法都需要被实现");
    }
}
